-module(starter).

-export([start/1]).

-import(ggt,[start/5]).
-import(werkzeug,[logging/2,timeMilliSecond/0]).

%Einstiegspunkt in das Programm
start(Starteranzahl) 	-> 		startStarter(Starteranzahl).
%initialisiert den Starter, indem er die Werte aus der ggt.cfg l�dt								
initialize() 				-> 	{ok, ConfigListe} = file:consult("ggt.cfg"),
								{ok, Praktikumsgruppe} = werkzeug:get_config_value(praktikumsgruppe, ConfigListe),
								{ok, Teamnummer} = werkzeug:get_config_value(teamnummer, ConfigListe),
								{ok, NameserviceNode} = werkzeug:get_config_value(nameservicenode, ConfigListe),
								{ok, NameserviceName} = werkzeug:get_config_value(nameservicename, ConfigListe),
								{ok, Koordinatorname} = werkzeug:get_config_value(koordinatorname, ConfigListe),
								{lists:concat([Praktikumsgruppe,Teamnummer]),NameserviceNode, Koordinatorname, NameserviceName}.

%Startet den Starter								
startStarter(Starterzahl) 	->	{Gruppenprefix,NameserviceNode,Koordinatorname,NameserviceName} =	initialize(),
								writeToLog(lists:concat(["Starter", Starterzahl]),lists:concat(["Starter", Starterzahl," am ",werkzeug:timeMilliSecond(), " gestartet."])),
								net_adm:ping(NameserviceNode),
								timer:sleep(500),
								Nameservice = global:whereis_name(NameserviceName),
								%erfragt den Koordinatornamen und Node, und wartet sofort auf eine antwort.
								Nameservice ! {self(),{lookup,Koordinatorname}},
								receive 			   {pin,{Name,Node}}-> Koordinator = {Name,Node},
															writeToLog(lists:concat(["Starter", Starterzahl]),lists:concat(["Koordinator: ",Name," auf Node: ", Node," gebunden."]));
												    not_found	-> 	writeToLog(lists:concat(["Starter", Starterzahl]),lists:concat(["Koordinator nicht beim namensdienst gefunden, fahre Prozess runter"])),
															Koordinator = 0
								end,
								%erfragt die Steuerwerte vom Koordinator, diese werden in einem Triple mit dem Namen Steeringval gespeichert
								%format vom Triple = {Arbeitszeit,Termzeit,GGTAnzahl}
								if
								Koordinator == 0 ->	writeToLog(lists:concat(["Starter", Starterzahl]),lists:concat(["Starter wird runtergefahren"]));	
								true 		->	Koordinator ! {getsteeringval,self()},
											receive {steeringval,ArbeitsZeit,TermZeit,GGTProzessnummer} ->	writeToLog(lists:concat(["Starter", Starterzahl]),lists:concat(["Arbeitszeit: ",ArbeitsZeit,"\n\r Termzeit ", TermZeit,"\n\r Anzahl der GGTProzesse: ", GGTProzessnummer]))
											end,
											spawn(fun() -> startGGT(Gruppenprefix,Starterzahl,Koordinator,Nameservice,ArbeitsZeit,TermZeit,GGTProzessnummer) end)
								end.

%startet die angegebene Anzahl an GGT Prozessen pro starter.																					
startGGT(_,_,_,_,_,_,0) -> ok;
startGGT(Gruppenprefix,Starterzahl,Koordinator,Nameservice,ArbeitsZeit,TermZeit,GGTProzessnummer)		->	GgtName = erlang:list_to_atom(lists:concat([Gruppenprefix,Starterzahl,GGTProzessnummer])),
																											spawn(fun() -> ggt:start(GgtName,Koordinator,Nameservice,ArbeitsZeit,TermZeit)end),
																											writeToLog(lists:concat(["Starter", Starterzahl]),lists:concat(["Starte GGT mit der Nummer: ", GgtName])),
																											startGGT(Gruppenprefix,Starterzahl,Koordinator,Nameservice,ArbeitsZeit,TermZeit,GGTProzessnummer-1).
%loggen in �bergebenen Dateinamen
writeToLog(MyLogFileName, Text) ->  werkzeug:logging(lists:concat([MyLogFileName,".log"]), lists:concat([Text,"\r\n"])).																											